package metier;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

import persistence.dao.PersonneDAO;
import persistence.model.Affectation;
import persistence.model.Personne;
import persistence.model.Tache;
import presentation.beans.AffectationBean;
import presentation.beans.PersonneBean;
import presentation.beans.TacheBean;

/**
 * @author Ben
 * 
 */
public class PersonneAction {

	/**
	 * 
	 */
	private PersonneDAO personneDAO = PersonneDAO.getInstance();

	/**
	 * @param personneBean
	 * @return
	 */
	public final boolean login(PersonneBean personneBean) {
		final HttpServletRequest request = (HttpServletRequest) (FacesContext
				.getCurrentInstance().getExternalContext().getRequest());
		final Personne personne = personneDAO.getPersonneFromLogin(personneBean
				.getLoginPersonne());
		// [FSA] si la personne n'est pas trouv�e, personne vaut null
		if (personne != null
				&& personneBean.getPasswordPersonne().equals(
						personne.getPasswordPersonne())) {
			personneBean = personneToBean(personne);
			request.getSession().setAttribute("user", personneBean);
			return true;
		} else
			return false;
	}

	/**
	 * @param id
	 * @return
	 */
	public final PersonneBean getPersonneBeanFromId(final Long id) {
		final Personne personne = personneDAO.getPersonneFromId(id);
		if (personne != null) {
			return personneToBean(personne);
		} else {
			return null;
		}
	}

	/**
	 * @param personneBean
	 * @return
	 */
	public boolean createUser(final PersonneBean personneBean) {
		final Personne personne = beanToPersonne(personneBean);
		personneDAO.createUser(personne);
		return true;
	}

	/**
	 * @param personneBean
	 * @return
	 */
	public PersonneBean updateCurrentUser(PersonneBean personneBean) {
		Personne personne = beanToPersonne(personneBean);
		personne = personneDAO.updateUser(personne);
		personneBean = personneToBean(personne);
		PersonneBean.saveToSession(personneBean);
		return personneBean;
	}

	/**
	 * @param personneBean
	 * @return
	 */
	public PersonneBean updateUser(final PersonneBean personneBean) {
		Personne personne = beanToPersonne(personneBean);
		personne = personneDAO.updateUser(personne);
		return personneToBean(personne);
	}

	/**
	 * @param personne
	 * @return
	 */
	public static PersonneBean personneToBean(final Personne personne) {
		final PersonneBean personneBean = new PersonneBean();
		personneBean.setIdPersonne(personne.getIdPersonne());
		personneBean.setLoginPersonne(personne.getLoginPersonne());
		personneBean.setNomPersonne(personne.getNomPersonne());
		personneBean.setPasswordPersonne(personne.getPasswordPersonne());
		personneBean.setPrenomPersonne(personne.getPrenomPersonne());
		List<Affectation> affectation = new ArrayList<Affectation>(
				personne.getAffectation());
		List<AffectationBean> affectations = new ArrayList<AffectationBean>();
		for (Affectation affect : affectation) {
			affectations.add(AffectationAction.affectationToBean(affect));
		}
		personneBean.setAffectation(affectations);
		List<Tache> tacheList = new ArrayList<Tache>(personne.getTache());
		List<TacheBean> tacheBeanList = new ArrayList<TacheBean>();
		for (Tache tache : tacheList) {
			tacheBeanList.add(TacheAction.TacheToBean(tache));
		}
		personneBean.setTache(tacheBeanList);
		return personneBean;
	}

	/**
	 * @param personneBean
	 * @return
	 */
	public static Personne beanToPersonne(final PersonneBean personneBean) {
		final Personne personne = new Personne();
		personne.setIdPersonne(personneBean.getIdPersonne());
		personne.setLoginPersonne(personneBean.getLoginPersonne());
		personne.setNomPersonne(personneBean.getNomPersonne());
		personne.setPasswordPersonne(personneBean.getPasswordPersonne());
		personne.setPrenomPersonne(personneBean.getPrenomPersonne());
		Set<Affectation> affectation = new HashSet<Affectation>();
		List<AffectationBean> affectations = new ArrayList<AffectationBean>(
				personneBean.getAffectation());
		for (AffectationBean affect : affectations) {
			affectation.add(AffectationAction.beanToAffectation(affect));
		}
		personne.setAffectation(affectation);
		Set<Tache> tacheSet = new HashSet<Tache>();
		List<TacheBean> tacheBeanList = new ArrayList<TacheBean>(
				personneBean.getTache());
		for (TacheBean tacheBean : tacheBeanList) {
			tacheSet.add(TacheAction.beanToTache(tacheBean));
		}
		personne.setTache(tacheSet);
		return personne;
	}

	/**
	 * @param personne
	 * @return
	 */
	public static PersonneBean personneToSimpleBean(final Personne personne) {
		final PersonneBean personneBean = new PersonneBean();
		personneBean.setIdPersonne(personne.getIdPersonne());
		personneBean.setLoginPersonne(personne.getLoginPersonne());
		personneBean.setNomPersonne(personne.getNomPersonne());
		personneBean.setPasswordPersonne(personne.getPasswordPersonne());
		personneBean.setPrenomPersonne(personne.getPrenomPersonne());
		// TODO taches
		return personneBean;
	}

	/**
	 * @param personneBean
	 * @return
	 */
	public static Personne simpleBeanToPersonne(final PersonneBean personneBean) {
		final Personne personne = new Personne();
		personne.setIdPersonne(personneBean.getIdPersonne());
		personne.setLoginPersonne(personneBean.getLoginPersonne());
		personne.setNomPersonne(personneBean.getNomPersonne());
		personne.setPasswordPersonne(personneBean.getPasswordPersonne());
		personne.setPrenomPersonne(personneBean.getPrenomPersonne());
		// TODO taches
		return personne;
	}

	/**
	 * @param personneBean
	 * @return
	 */
	private Personne sessionToPersonne(final PersonneBean personneBean) {
		final Personne personne = new Personne();
		personne.setIdPersonne(personneBean.getSessionPersonne()
				.getIdPersonne());
		personne.setLoginPersonne(personneBean.getSessionPersonne()
				.getLoginPersonne());
		personne.setNomPersonne(personneBean.getSessionPersonne()
				.getNomPersonne());
		personne.setPasswordPersonne(personneBean.getSessionPersonne()
				.getPasswordPersonne());
		personne.setPrenomPersonne(personneBean.getSessionPersonne()
				.getPrenomPersonne());
		// supprim� pour �viter les r�f�rences circulaires
		// personne.setTache(personneBean.getTache());
		return personne;
	}

	/**
	 * @param personneBean
	 * @return
	 */
	public PersonneBean updateFromDatabase(PersonneBean personneBean) {
		final Personne personne = personneDAO.getPersonneFromLogin(personneBean
				.getLoginPersonne());
		return personneToBean(personne);
	}

	/**
	 * @return
	 */
	public List<PersonneBean> fetchPersonnes() {
		final List<PersonneBean> personnes = new ArrayList<PersonneBean>();
		final List<Personne> personne = personneDAO.fetchPersonnes();
		for (Personne pers : personne)
			personnes.add(personneToBean(pers));
		return personnes;
	}

	/**
	 * @param personneBean
	 * @return
	 */
	public PersonneBean updateAdminUser(PersonneBean personneBean) {
		Personne personne = new Personne();
		personne = beanToPersonne(personneBean);
		personne = personneDAO.updateUser(personne);
		personneBean = personneToBean(personne);
		return personneBean;
	}

	/**
	 * @param personneBean
	 */
	public void deleteUser(final PersonneBean personneBean) {
		personneDAO.deleteUser(beanToPersonne(personneBean));
	}

	public boolean existUser(String login) {
		if (personneDAO.getPersonneFromLogin(login) == null)
			return false;
		return true;
	}

	public void addTache(PersonneBean personne, TacheBean tacheBean) {
		personneDAO.addTache(beanToPersonne(personne),
				TacheAction.beanToTache(tacheBean));
	}

	public void removeTache(PersonneBean personne, TacheBean tacheBean) {
		personneDAO.removeTache(beanToPersonne(personne),
				TacheAction.beanToTache(tacheBean));
	}
}
